package com.imooc.springboot.util;

import com.sun.corba.se.impl.ior.ByteBuffer;

import java.io.File;
import java.io.FileWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 工具类
 * 
 * @version 1.0
 */

public class PubTool {


	/**
	 * 计算md5值
	 * 
	 * @param inStr
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String MD5Compute(String inStr)
			throws NoSuchAlgorithmException {
		MessageDigest md5 = MessageDigest.getInstance("MD5");

		char[] charArray = inStr.toCharArray();

		byte[] byteArray = new byte[charArray.length];

		for (int i = 0; i < charArray.length; i++)
			byteArray[i] = (byte) charArray[i];

		byte[] md5Bytes = md5.digest(byteArray);

		StringBuffer hexValue = new StringBuffer();

		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16)
				hexValue.append("0");
			hexValue.append(Integer.toHexString(val));
		}

		return hexValue.toString();
	}


	/**
	 * 将int转为String形式的hex码
	 * 
	 * @param srcInt
	 * @return String
	 */
	public static String int2HexString(int srcInt) {
		String result = Integer.toHexString(srcInt);
		if (result.length() % 2 == 1)
			result = "0" + result;
		return result;
	}
	
	/**
	 * 将传入的String型参数增加月数，按照格式区分年月
	 * 
	 * @param
	 *            pny ,
	 * @param
	 *            pformat :可以是6位yyyymm或者8位yyyymmdd,
	 * @param
	 *            pint 增加月数，可以是负数
	 * @return String
	 */
	public static String addMonth(String pny, String pformat, int pint)
			throws Exception {
		Date vdate = stringToDate(pny, pformat);
		vdate = addMonth(vdate, pint);
		String vdates = dateToString(vdate, pformat);
		return vdates;
	}

	/**
	 * 将传入的String型参数增加天数，按照格式区分年月
	 *
	 * @param
	 *            pny ,
	 * @param
	 *            pformat :可以是6位yyyymm或者8位yyyymmdd,
	 * @param
	 *            pint 增加月数，可以是负数
	 * @return String
	 */
	public static String addDay(String pny, String pformat, int pint)
			throws Exception {
		Date vdate = stringToDate(pny, pformat);
		vdate = addDay(vdate, pint);
		String vdates = dateToString(vdate, pformat);
		return vdates;
	}

	/**
	 * 将传入的java.util.Date型参数增加月数
	 * 
	 * @param
	 *            pdate ,
	 * @param
	 *            paddmon 增加月数，可以是负数
	 * @return java.util.Date
	 */
	public static Date addMonth(Date pdate, int paddmon)
			throws Exception {

		Calendar vcal = Calendar.getInstance();
		vcal.setTime(pdate);
		vcal.add(Calendar.MONTH, paddmon);
		pdate = vcal.getTime();
		return pdate;
	}

	/**
	 * 将传入的java.util.Date型参数增加天数
	 * 
	 * @param
	 *            pdate ,
	 * @param
	 *
	 * @return java.util.Date
	 */
	public static Date addDay(Date pdate, int paddday)
			throws Exception {

		Calendar vcal = Calendar.getInstance();
		vcal.setTime(pdate);
		vcal.add(Calendar.DATE, paddday);
		pdate = vcal.getTime();
		return pdate;
	}

	/**
	 * 将字符串转化为日期. 要求传入6位(yyyymm)或者8位(yyyymmdd)的参数
	 * 
	 * @param
	 * @return java.util.Date
	 */
	public static Date stringToDate(String s) throws Exception {

		Date vdate = null;
		String vformat = null;
		if (s == null) {
			return null;
		}
		s = s.trim();
		if (s.length() == 0) {
			return null;
		}

		if (s.length() != 4 && s.length() != 6 && s.length() != 8
				&& s.length() != 14) {
			throw new Exception("日期格式转换错误!传入参数" + s);
		}

		if (s.length() == 4) {
			vformat = "yyyy";
		} else if (s.length() == 6) {
			// /6位yyyymm
			vformat = "yyyyMM";
		} else if (s.length() == 8) {
			// 说明是8位 yyyymmdd
			vformat = "yyyyMMdd";
		} else {
			vformat = "yyyyMMddhhmmss";
		}
		vdate = stringToDate(s, vformat);
		return vdate;
	}

	/**
	 * 将字符串转化为日期. 要求传入的参数和对应的格式
	 * 
	 * @param
	 * @param
	 *            pformat
	 * @return java.util.Date
	 */
	public static Date stringToDate(String s, String pformat)
			throws Exception {
		Date vdate = null;
		SimpleDateFormat vsdf = null;

		if (s == null) {
			return null;
		}
		if (pformat == null) {
			return null;
		}
		s = s.trim();
		if (s.length() == 0) {
			return null;
		}
		if (pformat == null) {
			return null;
		}
		pformat = pformat.trim();
		// 转换格式，防止原来使用pb的习惯yyyymm的格式
		pformat = pformat.toLowerCase();
		pformat = pformat.replaceFirst("mm", "MM");
		pformat = pformat.replaceFirst("hh", "HH");
		if (s.length() < pformat.length()) {
			throw new Exception("日期格式转换错误!传入参数日期[" + s + "]和小于格式["
					+ pformat + "]的长度");
		} else {
			s = s.substring(0, pformat.length());
		}
		vsdf = new SimpleDateFormat(pformat);
		vsdf.setLenient(false);
		try {
			vdate = vsdf.parse(s);
		} catch (Exception e) {
			throw new Exception("日期格式转换错误!传入参数日期[" + s + "]和格式["
					+ pformat + "]");
		}
		return vdate;
	}

	/**
	 * 将日期转化为字符串. 返回 14 位长度 yyyymmddHHMMSS 具体到秒
	 * 
	 * @param
	 * @return String 14位
	 */
	public static String dateToString(Date d) {
		String vs = null;
		SimpleDateFormat vsdf = null;

		if (d == null) {
			return null;
		}
		// 说明是8位 yyyymmdd
		vsdf = new SimpleDateFormat("yyyyMMddHHmmss");
		vs = vsdf.format(d);
		return vs;
	}

	/**
	 * 将日期转化为字符串. 返回 14 位长度 yyyyMMddHHmmss 具体到秒
	 * 
	 * @param
	 * @return String 14位
	 */
	public static String dateToString(Date d, String pformat) {

		String vs = null;
		SimpleDateFormat vsdf = null;

		if (d == null) {
			return null;
		}
		if (pformat == null) {
			return null;
		}
		// 转换格式，防止原来使用pb的习惯yyyymm的格式
		pformat = pformat.toLowerCase();
		pformat = pformat.replaceFirst("mm", "MM");
		pformat = pformat.replaceFirst("hh", "HH");
		vsdf = new SimpleDateFormat(pformat);
		vsdf.setLenient(false);
		vs = vsdf.format(d);
		return vs;
	}
	
	/**
	 * 将残缺的时间串 按照规则补全14位 传入pformat大小写严格按照规定处理 yyyyMMddHHmmss
	 * @author 刘斯潮
	 *  Jul 29, 2009
	 * @param s
	 * @param pformat
	 * @return
	 * @throws Exception
	 */
	public static String dateStrToStandDateString(String s,String pformat) throws Exception {
		
		if (s == null) {
			return null;
		}
		if (pformat == null) {
			return null;
		}
		s = s.trim();
		if (s.length() == 0) {
			return null;
		}
		Date time = null;
		SimpleDateFormat vsdf = null;
		
		if (s.length() < pformat.length()) {
			throw new Exception("日期格式转换错误!传入参数日期[" + s + "]和小于格式["
					+ pformat + "]的长度");
		} else {
			s = s.substring(0, pformat.length());
		}
		try {
			//在parse之前把时间格式补充完成，否则会出现吧31set到4月，日期丢失的情况
			Calendar curCal = Calendar.getInstance();
			if(pformat.startsWith("dd")){
				//如果day已过，set当月，day没过，set上月
				int day = Integer.valueOf(s.substring(0, 2));
				int curDay = curCal.get(Calendar.DAY_OF_MONTH);
				String month ="";
				if(day>curDay){
					month = String.valueOf(curCal.get(Calendar.MONTH));
					//如果取得当前月为1月即month=0，则上推上个月为12月
					if(month.equals("0")){
						month = "12";
					}
				}else{
					month = String.valueOf(curCal.get(Calendar.MONTH)+1);
				}
				s= (month.length()==2?month:"0"+month)+s;
				pformat = "MM"+pformat;
			}
			if(pformat.startsWith("MM")){
				//如果MM已过，set当年，MM没过，set上一年
				int month = Integer.valueOf(s.substring(0, 2));
				int curMonth = curCal.get(Calendar.MONTH)+1;//获得当前月份
				if(month>curMonth){
					s=(curCal.get(Calendar.YEAR)-1)+s;
				}else{
					s=curCal.get(Calendar.YEAR)+s;
				}
				pformat = "yyyy"+pformat;
			}
			vsdf = new SimpleDateFormat(pformat);
			vsdf.setLenient(false);
			time = vsdf.parse(s);
		} catch (Exception e) {
			throw new Exception("日期格式转换错误!传入参数日期[" + s + "]和格式["
					+ pformat + "]");
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(time);
		return PubTool.dateToString(cal.getTime());
	}

	/**
	 * 四舍五入函数
	 * 
	 * @param
	 *            d 原double
	 * @param
	 *            i 小数位
	 * @return double
	 */
	public static double round(double d, int i) {
		double tmp = Math.pow(10, i);
		return Math.round(d * tmp) / tmp;
	}
	/**
	 * 四舍五入函数
	 * 
	 * @param
	 *            d 原double
	 * @param
	 *            i 小数位
	 * @return double
	 */
	public static double round(long d, int i) {
		long tmp = (long) Math.pow(10, i);
		return Math.round(d * tmp) / tmp;
	}
	/**
	 * 判定一个字符串是不是数值，包括long ,double, 科学计数法
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNumber(String s) {
		try {
			Double.parseDouble(s);
			return true;
		} catch (Exception ex) {
			return false;
		}
	}

	/**
	 * 求两个日期之间相差的天数
	 * 
	 * @param d1
	 * @param d2
	 * @return long
	 */
	public static long daysBetween(Date d1, Date d2) {
		if ((d1 == null) || (d2 == null)) {
			return 0;
		}
		long ld1 = d1.getTime();
		long ld2 = d2.getTime();

		long days = (long) ((ld2 - ld1) / 86400000);
		return days;
	}

	/**
	 * 求两个日期之间相差的月数
	 * 
	 * @param d1
	 * @param d2
	 * @return int
	 */
	public static int monthsBetween(Date d1, Date d2) {
		if ((d1 == null) || (d2 == null)) {
			return 0;
		}
		int year1 = PubTool.stringToInt(PubTool.dateToString(d1, "yyyy"));
		int year2 = PubTool.stringToInt(PubTool.dateToString(d2, "yyyy"));
		int month1 = PubTool.stringToInt(PubTool.dateToString(d1, "MM"));
		int month2 = PubTool.stringToInt(PubTool.dateToString(d2, "MM"));
		int day1 = PubTool.stringToInt(PubTool.dateToString(d1, "dd"));
		int day2 = PubTool.stringToInt(PubTool.dateToString(d2, "dd"));
		int months = (year2 - year1) * 12 + month2 - month1;
		if (day2 < day1) // 判断 日 是否满一个月，不满则月份减1
			months--;
		return months;
	}

	/**
	 * 判断p_str是 否是Date类型的字符串,格式为"yyyy.mm.dd"或者"yyyymmdd"
	 * 
	 * @param p_str
	 * @return boolean
	 */
	public static boolean isDate(String p_str) {
		String s = null;

		if (p_str == null) {
			return false;
		}
		if (p_str.length() != 10 && p_str.length() != 8) {
			return false;
		}
		if (p_str.length() == 10) {
			s = p_str.substring(0, 4) + p_str.substring(5, 7)
					+ p_str.substring(8, 10);
		} else {
			s = p_str;
		}
		try {
			stringToDate(s, "yyyyMMdd");
		} catch (Exception ex) {
			return false;
		}

		return true;
	}

	/**
	 * 将一个字符串trim，如果是null，返回""
	 * 
	 * @param s
	 * @return string
	 */
	public static String trim(String s) {

		if (s == null) {
			return null;
		}
		s = s.trim();
		return s;
	}

	/**
	 * 将数字转换成大写汉字
	 * 
	 * @param
	 *            num 数字
	 * @return String 大写汉字
	 */
	public static String n2M(double num) throws Exception {
		String vdw = "仟佰拾亿仟佰拾万仟佰拾圆角分";
		String vsz = "零壹贰叁肆伍陆柒捌玖";
		String vstr = "", vm = "";
		double vnum = 0;
		int vi = 0, vn = 0, vl = 0, vf = 0, vy = 0;
		if (num == 0) {
			return "零分";
		}

		if (num > 0) {
			vnum = num;
			vm = "";
		} else {
			vnum = 0 - num;
			vm = "退:";
		}
		vstr = PubTool.numberToString(vnum * 100, ".00").trim();
		vstr = vstr.substring(0, vstr.indexOf("."));
		vl = vstr.length();
		vi = vl;
		vf = 1;

		if (vl > 14) {
			throw new Exception(
					"对不起，阿拉伯数字转换为大写汉字的转换方法[PubTool.n2M]只能处理一万亿(1,000,000,000,000.00)以下的数字！");
		}
		while (vi >= 11) {
			vn = vstr.charAt(vl - vi) - '0';
			if (!(vf == 0 & vn == 0)) {
				vm = vm + vsz.substring(vn, vn + 1);
				if (vn >= 1) {
					vm = vm + vdw.substring(14 - vi, 15 - vi);
					vy = 1;
				}
			}
			vf = vn;
			vi--;
		}

		if (vf == 0) {
			vm = vm.substring(0, vm.length() - 1) + "亿";
			vf = 1;
			vy = 1;
		}

		while (vi >= 7) {
			vn = vstr.charAt(vl - vi) - '0';
			if (!(vf == 0 & vn == 0)) {
				vm = vm + vsz.substring(vn, vn + 1);
				if (vn >= 1) {
					vm = vm + vdw.substring(14 - vi, 15 - vi);
				}
			}
			vf = vn;
			vi--;
		}

		if (vf == 0 & vy == 0) {
			vm = vm.substring(0, vm.length() - 1) + "万";
			vf = 1;
		}

		while (vi >= 3) {
			vn = vstr.charAt(vl - vi) - '0';
			if (!(vf == 0 & vn == 0)) {
				vm = vm + vsz.substring(vn, vn + 1);
				if (vn >= 1) {
					vm = vm + vdw.substring(14 - vi, 15 - vi);
				}
			}
			vf = vn;
			vi--;
		}
		if (vf == 0) {
			vm = vm.substring(0, vm.length() - 1) + "圆";
			vf = 1;
		}
		while (vi > 0) {
			vn = vstr.charAt(vl - vi) - '0';
			if (!(vf == 0 & vn == 0)) {
				vm = vm + vsz.substring(vn, vn + 1);
			}
			if (vn >= 1) {
				vm = vm + vdw.substring(14 - vi, 15 - vi);
			}
			vf = vn;
			vi--;
		}
		if (vf == 0) {
			vm = vm.substring(0, vm.length() - 1) + "整";
		}
		return vm;
	}

	/**
	 * 判定如果字符串a is null，返回b,否则是a
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static String nvlStr(String a, String b) {
		if (a == null) {
			return b;
		}
		return a;
	}

	/**
	 * 去掉右空格
	 * 
	 * @param
	 *            str
	 * @return String
	 */
	public static String rTrim(String str) {
		for (int i = str.length() - 1; i > 0; i--) {
			if (str.charAt(i) != ' ') {
				return str;
			}
			str = str.substring(0, i);
		}
		return str.trim();
	}

	/**
	 * 去掉左空格
	 * 
	 * @param
	 *            str
	 * @return String
	 */
	public static String lTrim(String str) {
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) != ' ') {
				return str;
			}
			str = str.substring(i + 1, str.length());
		}
		return str.trim();
	}

	/**
	 * 将字符串转化为int，空转化为0，不能转化抛异常。
	 */
	public static int stringToInt(String s) {
		if (s == null) {
			return 0;
		}
		s = s.trim();
		if (s.equals("")) {
			return 0;
		}
		int i = Integer.parseInt(s);
		return i;
	}

	/**
	 * 将字符串转化为int，空转化为0，不能转化抛异常。
	 */
	public static double stringToDouble(String s) {
		if (s == null) {
			return 0.0;
		}
		s = s.trim();
		if (s.equals("")) {
			return 0.0;
		}
		double i = Double.parseDouble(s);
		return i;
	}


	/**
	 * 将数值型转换为字符串
	 * 
	 * @param num
	 * @param pformat
	 * @return
	 * @throws Exception
	 */
	public static String numberToString(double num, String pformat)
			throws Exception {
		if (pformat == null) {
			pformat = "";
		}
		String vs = null;
		try {
			DecimalFormat df = new DecimalFormat(pformat);
			vs = df.format(num);
		} catch (Exception e) {
			throw new Exception("数值格式转换错误!传入参数数值[" + num + "]和格式[" + pformat
					+ "]");
		}
		return vs;
	}

	/**
	 * 将数值型转换为字符串
	 * 
	 * @param num
	 * @return
	 * @throws Exception
	 */
	public static String numberToString(double num) throws Exception {
		String vs = null;
		try {
			DecimalFormat df = new DecimalFormat("");
			df.setGroupingUsed(false);
			vs = df.format(num);
		} catch (Exception e) {
			throw new Exception("数值格式转换错误!传入参数数值[" + num + "]");
		}
		return vs;
	}

	/**
	 * 将数值型转换为字符串
	 * 
	 * @param num
	 * @return
	 * @throws Exception
	 */
	public static String numberToString(int num) throws Exception {
		return numberToString((double) num);
	}

	/**
	 * 将数值型转换为字符串
	 * 
	 * @param num
	 * @return
	 * @throws Exception
	 */
	public static String numberToString(int num, String pformat)
			throws Exception {
		return numberToString((double) num, pformat);
	}

	/**
	 * 得到绝对值
	 * 
	 * @param num
	 * @return
	 * @throws Exception
	 */
	public static double abs(double num) {
		if (num < 0) {
			return -1 * num;
		}
		return num;
	}

	/**
	 * 取某年月最后一天
	 * 
	 * @param pny
	 * @return
	 * @throws Exception
	 */
	public static String getLastDay(String pny) throws Exception {
		String vnf_s = null, vyf_s;
		int vnf = 0, vyf;
		vnf_s = pny.substring(0, 4);
		vyf_s = pny.substring(4, 6);
		vnf = PubTool.stringToInt(vnf_s);
		vyf = PubTool.stringToInt(vyf_s);
		if (vyf == 2) {
			if ((vnf % 4 == 0 && vnf % 100 != 0) || vnf % 400 == 0) {
				return "29";
			} else {
				return "28";
			}
		}
		switch (vyf) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			return "31";
		case 4:
		case 6:
		case 9:
		case 11:
			return "30";
		default:
			throw new Exception("输入年月错误！");
		}
	}

	/**
	 * 写文件
	 * 
	 * @param filePath
	 *            文件路径
	 * @param fileContent
	 *            文件内容
	 * @param appended
	 *            是否追加
	 */
	public static void fileWrite(String filePath, String fileContent,
			boolean appended) throws Exception {
		String path = filePath.substring(0, filePath.lastIndexOf("\\"));
		File dirFile = new File(path);
		// if (dirFile.exists() && !dirFile.isDirectory()) {
		// dirFile.delete();
		// }
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}
		FileWriter writer = null;
		try {
			writer = new FileWriter(filePath, appended);
		} catch (Exception e) {
			throw new Exception("创建文件错误:" + e.getMessage());
		}
		try {
			writer.write(fileContent);
		} catch (Exception e) {
			throw new Exception("写文件内容错误:" + e.getMessage());
		}
		try {
			writer.close();
		} catch (Exception e) {
			throw new Exception("关闭文件错误:" + e.getMessage());
		}
	}

	/**
	 * 写文件
	 * 
	 * @param filePath
	 *            文件路径
	 * @param fileContent
	 *            文件内容
	 */
	public static void fileWrite(String filePath, String fileContent)
			throws Exception {
		fileWrite(filePath, fileContent, false);
	}

	/**
	 * author 陈凯平
	 * 
	 * @param qsny
	 *            起始年月
	 * @param zzny
	 *            终止年月 传入string类型的参数，计算相隔的月数。
	 */
	public static int monthBetween(String qsny, String zzny) throws Exception {
		if ((qsny.length() != 6 && qsny.length() != 8)
				|| (zzny.length() != 6 && zzny.length() != 8)) {
			throw new Exception("请输入形如\"yyyymmdd\"或者\"yyyymm\"的日期格式!");
		}
		Date vQsny_date = PubTool.stringToDate(qsny);
		Date vZzny_date = PubTool.stringToDate(zzny);

		return PubTool.monthsBetween(vQsny_date, vZzny_date);
	}

	/**
	 * 
	 * Description:String的length()方法计算字符串长度，英文一个字母算一个，汉语一个字也算一个。
	 * <p>
	 * 在填充表格时不能精确确定显示内容的长度。编写chnSubstring和chnStrLen方法，计算字符
	 * <p>
	 * 串长度和截取子串时，一个汉字长度算两个。
	 * <p>
	 * 下面是chnSubstring方法。
	 * 
	 * @param input
	 * @param start
	 * @param end
	 * @return
	 */
	public static String chnSubstring(String input, int start, int end) {
		if (null == input)
			return null;

		int startIdx = 0, endIdx = input.length();
		int currentPos = 0, currentCharLen = 0;
		boolean flag = false;

		if (end > chnStrLen(input)) {
			end = chnStrLen(input);
		}
		if (start >= end)
			return "";

		for (int i = 0; i < input.length(); i++) {
			if ((int) input.charAt(i) > 255)
				currentCharLen = 2;
			else
				currentCharLen = 1;

			if (flag == false && currentPos >= start) {
				if (currentPos > start)
					startIdx = i - 1;
				else
					startIdx = i;
				flag = true;
			}
			if (flag == true && currentPos + currentCharLen > end) {
				endIdx = i;
				break;
			}
			currentPos += currentCharLen;
		}
		if (flag == false) {
			startIdx = input.length() - 1;
		}
		return input.substring(startIdx, endIdx);
	}

	/**
	 * 
	 * Description:String的length()方法计算字符串长度，英文一个字母算一个，汉语一个字也算一个。
	 * <p>
	 * 在填充表格时不能精确确定显示内容的长度。编写chnSubstring和chnStrLen方法，计算字符
	 * <p>
	 * 串长度和截取子串时，一个汉字长度算两个。
	 * <p>
	 * 下面是chnStrLen方法。
	 * 
	 * @param input
	 * @param
	 * @param
	 * @return
	 */
	public static int chnStrLen(String input) {
		int len = 0;

		for (int i = 0; i < input.length(); i++) {
			if (((int) input.charAt(i)) > 255)
				len += 2;
			else
				len++;
		}
		return len;
	}

	public static byte[] str2HexBytes(String str) {
		if (str == null) {
			return null;
		}
		if (str.length() % 2 != 0) {
//			return null;
			str="0"+str;//hdz 2011-7-23修改补足偶数位。
		}
		byte[] bytes = new byte[str.length() / 2];
		for (int j = 0; j < str.length() / 2; j++) {
			String tmp = str.substring(0 + j * 2, 2 + j * 2);
			try {
				byte tmpint = (byte) Integer.parseInt(PubTool.any2Decimal(tmp,
						16));
				bytes[j] = tmpint;
			} catch (NumberFormatException e) {
				return null;
			}
		}
		return bytes;
	}

	/**
	 * 任意进制转化为10进制整数
	 * 
	 * @param src
	 * @param
	 * @return
	 * @throws Exception
	 */
	public static String any2Decimal(String src, int system) {
		int result = 0, n;
		if (system < 2 || system > 16)
			return null;
		String figures = "0123456789ABCDEF".substring(0, system);
		for (int i = 0; i < src.length(); i++) {
			try {
				n = figures.indexOf(src.toUpperCase().charAt(i));
			} catch (StringIndexOutOfBoundsException e) {
				return null;
			}
			if (n == -1) {
				return null;
			}
			result = (int) (n * Math.pow(system, src.length() - i - 1))
					+ result;
		}

		return String.valueOf(result);
	}

	public static String bytes2Str(byte[] data) {
		StringBuffer buffer = new StringBuffer();
		for (int i = 0; i < data.length; i++) {
			String value = Integer.toHexString((data[i] + 256) % 256);
			value = "00" + value;
			value = value.substring(value.length() - 2, value.length());
			buffer.append(value);
		}
		return buffer.toString();
	}

	public static byte[] appendByte(byte[] s1, byte[] s2) {
		ByteBuffer bf = new ByteBuffer();
		for (int i = 0; i < s1.length; i++) {
			bf.append(s1[i]);
		}
		for (int i = 0; i < s2.length; i++) {
			bf.append(s2[i]);
		}
		bf.trimToSize();
		byte[] result = bf.toArray();
		return result;
	}
	/**
	 * addHour
	 * author 张晖
	 * Sep 8, 2008
	 * @param pdate
	 * @param paddHour
	 * @return
	 */
	public static Date addHour(Date pdate, int paddHour){

		Calendar vcal = Calendar.getInstance();
		vcal.setTime(pdate);
		vcal.add(Calendar.HOUR, paddHour);
		pdate = vcal.getTime();
		return pdate;
	}
	/**
	 * addMinute
	 * author 张晖
	 * Sep 8, 2008
	 * @param pdate
	 * @param paddday
	 * @return
	 */
	public static Date addMinute(Date pdate, int paddday) {

		Calendar vcal = Calendar.getInstance();
		vcal.setTime(pdate);
		vcal.add(Calendar.MINUTE, paddday);
		pdate = vcal.getTime();
		return pdate;
	}
	/**
	 * 判断Ip地址合法性
	 * author 刘斯潮
	 * Feb 24, 2009
	 * @param address
	 * @return
	 */
	public static boolean checkIpFormat(String address) {
		if (null == address || "".equals(address))
			return false;
		else {
			String regx = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";
			return address.trim().matches(regx);
		}
	}

	/**
	 * 将字节流字符化输出
	 * @param data
	 * @return
	 */
	public static String formatBytes(byte[] data) {
		StringBuffer buffer = new StringBuffer("");
		for (int i = 0; i < data.length; i++) {
			String value = Integer.toHexString((data[i] + 256) % 256);
			value = "00" + value;
			value = value.substring(value.length() - 2, value.length());
			buffer.append(value + " ");
		}
		return buffer.toString();
	}
	
	/**
	 * 获取当前字符串格式的时间。
	 * @return
	 */
	public static String getCurDateStr(){
		Date date = new Date();
		return PubTool.dateToString(date,"yyyy-mm-dd hh:mm:ss");

	}
	
	/**
	 * 获取当前字符串格式的时间。
	 * @return
	 */
	public static String getNewDateStr(){
		Date date = new Date();
		return PubTool.dateToString(date,"yyyy-mm-dd");
	}
	
	public static String getFormattedTime(String pformat){
		Date now = new Date(System.currentTimeMillis());
		return  dateToString(now ,pformat);
	}
	
	public static String msToStandard(long time){
		long ms = time%1000;
		long s = (time/1000)%60;
		long mm = ((time/1000)/60)%60;
		long hh = ((time/1000)/60)/60;
		if (hh != 0) {
			return hh + "小時" + mm + "分" + s + "秒" + ms + "毫秒";
		} else if (mm != 0) {
			return mm + "分" + s + "秒" + ms + "毫秒";
		} else if (s != 0) {
			return s + "秒" + ms + "毫秒";
		} else {
			return ms + "毫秒";
		}
	}
	public static String sToStandard(String date){
		int s = PubTool.stringToInt(date);
	    int sec = s % 60;
	    int mm = ((s/60))%60;
	    int hh = ((s/60))/60;
		if (hh != 0) {
			return hh + "小時" + mm + "分" + sec + "秒";
		} else if (mm != 0) {
			return mm + "分" + sec + "秒";
		} else {
			return sec + "秒";
		}
	}
	/**
	 * 不为null且不为""返回true,否则返回false
	 * @param e
	 * @return
	 */
	public static boolean judgeNotNull(Object e){
		if(!"".equals(e)&&null!=e){
			return true;
		}else{
			return false;
		}
	}
	/**
	 * 为null或为""返回true,否则返回false
	 * @param e
	 * @return
	 */
	public static boolean judgeNull(Object e){
		if("".equals(e)||null==e){
			return true;
		}else{
			return false;
		}
	}
}
